#ifndef __OBJECT_META_OBJ_H__

#define __OBJECT_META_OBJ_H__

/**
 * @file meta_obj.h
 * @author your name (you@domain.com)
 * @brief 模块对象和实例对象，仅供内部可见
 * @version 0.1
 * @date 2022-07-02
 * 
 * @copyright Copyright (c) 2022
 * 
 */

#include "obj_string.h"


/**
 * @brief `ObjModule`是模块对象，模块就是在某独立作用域中定义的代码的集合。
 * 尽管模块是代码集合，但我们并不在其中保存代码（确切额说是代码对应的指令流），
 * 而是保存在代码单元中，代码单元就是函数对象，在函数对象中有专门存储指令的`instrStream`，
 * 代码编译后存储到`instrStream`中。在模块对象中只保存其中的模块变量---在模块中定义的全局变量。
 * 
 */
typedef struct {
    ObjHeader objHeader;
    SymbolTable moduleVarName; // 模块中的模块变量名， 即模块内的全局变量
    ValueBuffer  moduelVarValue; // 模块中的所有模块变量值，即模块内的全局变量
    ObjString  *name;
} ObjModule; // 模块对象 模块即在某独立作用域中定义的代码的集合

/**
 * 静态的域和方法属于类，被所有对象共享
 * 对象自己的数据仅仅是域的值，这就是同类对象之间的区别所在，
 * 因此对于不同的对象只要单独维护各自域的值就行
 * 对所有类的对象来说，它们的方法已经放在类型，那么剩下的区别是域的个数不同
 */
typedef struct {
    ObjHeader  objHeader;  // 用于查找它所属的类
    Value  fields[0];  // 此处是柔性数组
} ObjInstance;  // 对象实例

ObjModule * newObjModule(VM *vm, const char *modName);
ObjInstance* newObjInstance(VM *vm, Class *class);

#endif